#include "sockets.h"

void conectar_a_socket(int* sock_server,s_config* configuracion)
{
	// Funcion que inicializa el socket
	struct hostent *he;
	struct sockaddr_in server;
	
	if((he = gethostbyname(configuracion->ip)) == NULL)
	{
		printf("Error de host: %s\n",strerror(errno));
		exit(1);
	}

	// Crear socket
	if((*sock_server = socket(AF_INET, SOCK_STREAM, 0))<0)
	{
		printf("Error en socket: %s\n",strerror(errno));
		exit(1);
	}
	
	// Definir propiedades del socket
	server.sin_family = AF_INET;
	server.sin_port = htons(configuracion->puerto);
	server.sin_addr.s_addr = inet_addr(configuracion->ip);
	bzero(&(server.sin_zero),8);

	printf("Conectando...\n");
	
	// Conectar
	if(connect(*sock_server,(struct sockaddr *)&server,sizeof(struct sockaddr))<0)
	{
		printf("Error en connect: %s\n",strerror(errno));
		close(*sock_server);
		exit(1);
	}	
	
	// Conectado
	printf("Se establecio la conexion con el servidor.\n");
}

void iniciar_socket(int* sock,s_config* configuracion) 
{
	// Funcion que inicializa el socket del servidor por unica vez	
	int val=1;
	struct sockaddr_in srv;
	
	// Crear socket
	if((*sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("Error en socket: %s\n",strerror(errno));
		exit(1);
	}
	
	// Definir propiedades del socket
	srv.sin_family = AF_INET;
	srv.sin_port = htons(configuracion.puerto);
	srv.sin_addr.s_addr = inet_addr(configuracion.ip_srv);	

	// Reuse
	if(setsockopt(*sock,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(int)) == -1)
	{
		printf("Error en socket: %s\n",strerror(errno));
		exit(1);
	}
	
	// Vincular socket
	if(bind(*sock,(struct sockaddr*)&srv,sizeof(struct sockaddr)) <0)
	{
		printf("Error en bind: %s\n",strerror(errno));
		close(*sock);
		exit(1);
	}

	// Escuchar
	if(listen(*sock,0) <0)
	{
		printf("Error en listen: %s\n",strerror(errno));
		close(*sock);
		exit(1);
	}
}
